package com.dhcc.utils;

import com.dhcc.entity.SysDept;
import com.dhcc.response.SysDeptListTree;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 部门树构建工具类
 * @ProjectName Dhcc-Cloud
 * @PackageName com.dhcc.utils
 * @Title DeptTreeUtil
 * @Date 2025/1/6 21:48
 * @Author LiuGuoting
 */
public class DeptTreeBuilder {

    /**
     * 构建部门树
     *
     * @param allDepts 所有部门列表（原始 SysDept 列表）
     * @param parentId 父部门 ID，根部门为 null
     * @return 部门树
     */
    public static List<SysDeptListTree> buildDeptTree(List<SysDept> allDepts, String parentId) {
        // 将 SysDept 转换为 SysDeptVO
        List<SysDeptListTree> allDeptVOs = convertToDeptVOList(allDepts);

        // 使用转换后的 VO 列表递归构建树
        return buildTreeFromVO(allDeptVOs, parentId);
    }

    /**
     * 将 List<SysDept> 转换为 List<SysDeptVO>
     *
     * @param allDepts 原始部门列表
     * @return 转换后的部门 VO 列表
     */
    private static List<SysDeptListTree> convertToDeptVOList(List<SysDept> allDepts) {
        List<SysDeptListTree> voList = new ArrayList<>();
        for (SysDept dept : allDepts) {
            voList.add(convertToVO(dept));
        }
        return voList;
    }

    /**
     * 构建部门树（直接操作 SysDeptVO 列表）
     *
     * @param allDepts 所有部门 VO 列表
     * @param parentId 父部门 ID，根部门为 null
     * @return 部门树
     */
    public static List<SysDeptListTree> buildTreeFromVO(List<SysDeptListTree> allDepts, String parentId) {
        List<SysDeptListTree> tree = new ArrayList<>();
        for (SysDeptListTree dept : allDepts) {
            // 判断当前部门是否属于指定父部门
            if (Objects.equals(dept.getFatherDepartmentId(), parentId)) {
                // 递归设置子部门
                dept.setChildren(buildTreeFromVO(allDepts, dept.getId()));
                tree.add(dept);
            }
        }
        return tree;
    }

    /**
     * 将 SysDept 转换为 SysDeptVO
     *
     * @param dept SysDept 实体
     * @return SysDeptVO 对象
     */
    public static SysDeptListTree convertToVO(SysDept dept) {
        SysDeptListTree vo = new SysDeptListTree();
        BeanUtils.copyProperties(dept, vo);
        return vo;
    }
}
